package com.yiyi.word_test.util;

import com.yiyi.word_test.dto.GradeCountDTO;
import com.yiyi.word_test.enums.GradeEnum;
import java.text.DecimalFormat;

// 计算测试结果工具类
/*
* 参考链接：
*   1，博客：https://my.oschina.net/apdplat/blog/547668
*   2，github 代码：https://github.com/ysc/superword/blob/master/src/main/java/org/apdplat/superword/model/Quiz.java
* */
public class CalculateScoreUtil {

    // 计算常量
    // 原博主一百题使用常量为300，但其随时间还会有所变动
    // 更改为一个数组，按照不同等级递增。这些常数需要多次尝试才行，尽量找到一个最合适的
    private static final int[] SCALE = new int[]{400, 600, 900, 1100, 1300};

    public static Integer calculateScore(GradeCountDTO gradeCountDTO) {
        float score = 0;
        DecimalFormat df = new DecimalFormat("0.000");//设置保留位数

        // 计算每一等级对应的正确概率 = 每一个级别答对的题数 / 每一个级别总的题数
        float[] rightRate = new float[5];
        Integer[] gradeCount = GradeEnum.values()[gradeCountDTO.getGrade()].getNums();
        rightRate[0] = Float.valueOf(df.format((float)gradeCountDTO.getGradeCount1() / gradeCount[0]));
        rightRate[1] = Float.valueOf(df.format((float)gradeCountDTO.getGradeCount2() / gradeCount[1]));
        rightRate[2] = Float.valueOf(df.format((float)gradeCountDTO.getGradeCount3() / gradeCount[2]));
        rightRate[3] = Float.valueOf(df.format((float)gradeCountDTO.getGradeCount4() / gradeCount[3]));
        rightRate[4] = Float.valueOf(df.format((float)gradeCountDTO.getGradeCount5() / gradeCount[4]));

        //预估总词数
        for (int i = 0; i < 5; i++) {
            // 如果题目属于第一级, 则将第一级答对的比率乘以固定的预估值作为该题预估词数
            if (i > 0) {
                // 如果题目不属于第一级, 则将上一级答对的比率和本级相乘
                // 然后用这个比率乘以固定的预估值作为该题预估词数
                // 如果上一级全部答错, 则将上一级的答对比率固定设置为 0.1
                if (rightRate[i - 1] == 0) {
                    rightRate[i - 1] = 0.1f;
                }
                rightRate[i] *= rightRate[i - 1];
            }
            score += rightRate[i] * SCALE[i];
        }
        return (int)score;
    }
}
